package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.pojo.User;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.stream.Stream;

@Service(interfaceClass = RoleService.class)
public class RoleServiceImpl implements RoleService {
    //注入角色数据层
    @Autowired
    private RoleDao roleDao;

    /**
     * 分页查询角色
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
        //开启分页
        PageHelper.startPage(currentPage, pageSize);
        //根据条件查询角色
        Page<Role> page = roleDao.findByCondition(queryString);
        //返回分页数据
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 查询所有权限信息
     * @return
     */
    public List<Permission> findAllPermission() {
        return roleDao.findAllPermission();
    }

    /**
     * 查询所有菜单信息
     * @return
     */
    public List<Menu> findAllMenu() {
        return roleDao.findAllMenu();
    }

    /**
     * 新增角色
     * @param role
     * @param permissionIds
     * @param menuIds
     */
    public void add(Role role, Integer[] permissionIds, Integer[] menuIds) {
        roleDao.add(role);
        //保存关联权限及菜单信息
        if (permissionIds!=null||menuIds!=null){
            Integer roleId = role.getId();
            //调用关联方法
            setRoleAndPermission(roleId,permissionIds);
            setRoleAndMenu(roleId,menuIds);
        }
    }

    /**
     * 保存角色和权限关联信息
     */
    private void setRoleAndPermission(Integer roleId, Integer[] permissionIds) {
        //stream流+lamda表达式遍历，提高效率
        Stream.of(permissionIds).forEach(permissionId -> roleDao.setPermissionAssociation(roleId, permissionId));
    }
    /**
     * 保存角色和菜单关联信息
     */
    private void setRoleAndMenu(Integer roleId, Integer[] menuIds) {
        //stream流+lamda表达式遍历，提高效率
        Stream.of(menuIds).forEach(menuId -> roleDao.setMenuAssociation(roleId, menuId));
    }

    /**
     * 根据id查询角色基本信息（回显）
     * @param id
     * @return
     */
    public Role findById(Integer id) {
        return roleDao.findById(id);
    }

    /**
     * 查询指定角色关联的权限id（回显）
     * @param roleId
     * @return
     */
    public Integer[] findPermissionAssociationIds(Integer roleId) {

        return roleDao.findPermissionAssociationIds(roleId);
    }

    /**
     * 查询指定角色关联的菜单id（回显）
     * @param roleId
     * @return
     */
    public Integer[] findMenuAssociationIds(Integer roleId) {
        return roleDao.findMenuAssociationIds(roleId);
    }

    /**
     * 根据权限Id及菜单ID更新角色基本信息
     * @param role
     * @param permissionIds
     * @param menuIds
     */
    public void update(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //更新角色基本信息
        roleDao.update(role);
        //删除角色关联权限信息
        roleDao.deletePermissionAssociation(role.getId());
        //删除角色关联菜单信息
        roleDao.deleteMenuAssociation(role.getId());
        //设置保存角色和权限关联信息
        setRoleAndPermission(role.getId(), permissionIds);
        //保存角色和菜单关联信息
        setRoleAndMenu(role.getId(),menuIds);
    }

    /**
     * 根据ID删除角色
     * @param id
     */
    public void deleteById(Integer id) {
        //删除关联权限信息
        roleDao.deletePermissionAssociation(id);
        //删除关联菜单信息
        roleDao.deleteMenuAssociation(id);
        //删除角色信息
        roleDao.deleteById(id);

    }
}
